#include"drv_IIC.h"
#include"drv_systick.h"
#include"drv_tim4.h"
//scl->pb6,sda->pb7
#define SDA_H	GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define SDA_L	GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define SCL_H	GPIO_SetBits( GPIOB,GPIO_Pin_6)
#define SCL_L	GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define read_SDA	GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
#define ACK 0
#define NOACK 1
void drv_IIC_init()
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void drv_IIC_in()//初始化引脚为输入模式
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void drv_IIC_out()//初始化数据线为输出模式
{
		GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin=	GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void drv_IIC_start()//起始信号
{
	SCL_L;
	drv_IIC_out();
	SDA_H;
	SCL_H;
	tim4_delay_us(50);
	SDA_L;
	tim4_delay_us(50);
	SCL_L;
}
void drv_IIC_stop()//终止信号
{
	SCL_L;
	drv_IIC_out();
	SDA_L;
	SCL_H;
	tim4_delay_us(50);
	SDA_H;
	tim4_delay_us(50);
	//停止之后不用再拉高
}

void drv_sendACK()//应答信号
{
	SCL_L;
	drv_IIC_out();
	//SDA_H;
	SCL_H;
	SDA_L;
	tim4_delay_us(50);
	SCL_L;
}
void drv_sendNOACK()//非应答信号
{
	SCL_L;
	drv_IIC_out();
	//SDA_L;
	SCL_H;
	SDA_H;
	tim4_delay_us(50);
	SCL_L;
}

uint8_t drv_IIC_waitACK()//等待接收信号
{
	uint16_t tim=0;
	SCL_L;
	drv_IIC_in();
	SCL_H;
	while(read_SDA)//判断应答信号
	{
		tim++;
			if(tim>500)
			{
				drv_IIC_stop();
				return NOACK;
			}
	}
	SCL_L;
	return ACK;
}
void drv_ICC_senddate(uint8_t data)//发送数据
{
    uint8_t a=0;
	SCL_L;
	drv_IIC_out();
	for(a=0;a<8;a++)
	{
		if(data&0x80)
		{
			SDA_H;//接收数据1
		}
		else
		{
			SDA_L;//接受数据0
		}
		SCL_H;
		tim4_delay_us(1);
		SCL_L;
		tim4_delay_us(1);
		data=data<<1;
	}
	SCL_L;
}
uint8_t drv_IIC_readdate(uint8_t flag)//从机读数据，在传输数据时尽量不能改变数据线防止产生起始信号和停止信号“高电平采样，低电平换数据”
{
	uint8_t receive_data=0;
	uint8_t i=0;
		SCL_L;
	drv_IIC_in();
	for(i=0;i<8;i++)
	{
		receive_data=receive_data<<1;//左移到高位，这一步必须在时钟线处于低位时
		SCL_H;
		tim4_delay_us(1);
		if(read_SDA)//主机从从机读取数据，如果数据位是1，将最低位置1//采样
		{
			receive_data|=0x01;	
		}

		tim4_delay_us(1);
		SCL_L;//每次接受完一个数据，必须将时钟线置低电平，继续占用主机位置，“释放 I²C 时钟线，让总线回到空闲低电平，为下一次位操作做准备。”
		tim4_delay_us(1);

			
	}
			if(flag==ACK)
		{
			drv_sendACK();	//告诉从机还要下一个数据
		}
		else
		{
		drv_sendNOACK();//告诉从机这是最后一个数据
		}
	SCL_L;
	return receive_data;//成功将数据读了出来
}

